package Proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
//import org.slf4j.LoggerFactory;
//import org.slf4j.Logger;
public class Client {
	public static void main(String[] args) {
		// 创建目标对象
		TeacherDao target = new TeacherDao();
		// 获取到代理对象，并且将目标对象传递给代理对象
		TeacherDao instance = (TeacherDao) new ProxyFactory(target).getProxyInstance();
		// 执行代理方法
		instance.teach();
		instance.teach1();
	}
}

class TeacherDao {
	public void teach() {
		System.out.println("老师授课中，这是cglib动态代理，不需要实现接口");
	}
	public void teach1() {
		System.out.println("老师授课中1111111，这是cglib动态代理，不需要实现接口");
	}
}

class ProxyFactory implements MethodInterceptor {

	private Object target;

	public ProxyFactory(Object target) {
		this.target = target;
	}

	public Object getProxyInstance() {
		// 创建一个工具类
		Enhancer enhancer = new Enhancer();
		// 设置父类  需要代理的类
		enhancer.setSuperclass(target.getClass());
		// 设置回调函数
		enhancer.setCallback(this);
		// 返回代理对象
		return enhancer.create();
		
		//当然直接使用Enhancer中的静态Create方法，输入两个参数也可以进行快速创建一个代理类出来。
		//return enhancer.create(target.getClass(),this);//直接使用亦可
	}
	//Logger log=LoggerFactory.getLogger(ProxyFactory.class);
	@Override
	public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {

		System.out.println("cglib代理模式开始前的方法。。。。");
		//log.info("汉字Mainstart");
		Object invoke = method.invoke(target, args);
		System.out.println("cglib代理模式结束后的方法。。。。");
		return invoke;
	}
}

